Option Explicit

'################################################################
' Descriptor
' 全数据列 的 字段信息
'################################################################

Implements ISqlTranslateNameInfo
Implements ISqlTranslateColInfo

'################################################################
' Field
'################################################################
' 表名 token
Private tableNameToken As SqlToken
' [*] token
Private asteriskToken As SqlToken
' 表名 和 * 之间的 [.] token
Private pointToken As SqlToken
' 别名 token
' 表名.* as xx 这种格式是可以的，但是其别名是无效的
' 为了能够兼容已有的匹配方式，所以在这里包含别名 token
Private colAliasNameToken As SqlToken

' 原始表名
Private originTableName As String
' 原始表名的别名
Private tableAliasName As String

'################################################################
' Function
'################################################################
' 设置 [.] 所在的token
Public Sub setPointToken(ByRef pt As SqlToken)
    Set pointToken = pt
End Sub

' 设置列所在的表的表名 token
Public Sub setTableNameToken(ByRef tableNameTokenVal As SqlToken)
    Set tableNameToken = tableNameTokenVal

    If tableNameToken Is Nothing Then
        originTableName = ""
        tableAliasName = ""
    Else
        originTableName = tableNameToken.value
        tableAliasName = originTableName
    End If
End Sub

' 设置 [*] 的 token
Public Sub setAsteriskToken(ByRef asteriskTokenVal As SqlToken)
    Set asteriskToken = asteriskTokenVal
End Sub

'################################################################
' Implements ISqlTranslateColInfo Function
'################################################################
' 获取使用到的原始列名
Public Function ISqlTranslateColInfo_getOriginColName() As String
    ISqlTranslateColInfo_getOriginColName = ""
End Function

' 设置变换后的列名
Public Sub ISqlTranslateColInfo_setTranslatedColName(ByRef n As String)
    ' noop
End Sub

' 读取变换后的列名
Public Function ISqlTranslateColInfo_getTranslatedColName() As String
    ISqlTranslateColInfo_getTranslatedColName = translatedColName
End Function

' 获取使用到的原始表名
Public Function ISqlTranslateColInfo_getTableName() As String
    ISqlTranslateColInfo_getTableName = originTableName
End Function

' 设置表的别名
Public Sub ISqlTranslateColInfo_setTableAliasName(ByRef n As String)
    ' 缓存别名
    tableAliasName = n
    ' 将别名写回表名 token 中
    ' （只在sql中声明了列所在的表时进行覆盖）
    If Not tableNameToken Is Nothing Then
        tableNameToken.value = n
    End If
End Sub

' 获取表的别名
Public Function ISqlTranslateColInfo_getTableAliasName() As String
    ISqlTranslateColInfo_getTableAliasName = tableAliasName
End Function

' 设置当前列的别名
Public Sub ISqlTranslateColInfo_setAliasNameToken(ByRef token As SqlToken)
    Set colAliasNameToken = token
End Sub

' 获取当前列的别名
Public Function ISqlTranslateColInfo_getAliasName() As String
    If colAliasNameToken Is Nothing Then
        ISqlTranslateColInfo_getAliasName = ""
    Else
        ISqlTranslateColInfo_getAliasName = colAliasNameToken.value
    End If
End Function

' 翻译列信息
' @param startEnv 搜索表名的起始作用域(当前列所在的 env)
' @param translateType 转换的类型(逻辑->物理=0, 物理->逻辑=1)
Public Sub ISqlTranslateColInfo_translate(ByRef startEnv As ISqlTranslateEnv, ByRef em As ISqlEntityManager, ByVal translateType As Integer)
    ' 1. 如果[表名]为空，则立刻停止
    ' 2. 搜索表名所在的作用域
    '       如果【表名】不在缓存中 --> 到父作用域中搜索
    ' 3. 替换[表名]
    '     1. 如果 [表名] 已经在别名集合 `tableAliasNameSet` 中了，则不需要替换
    '     2. 如果 [表名] 不在别名集合中，则尝试到缓存 `tableAliasNameMap` 中获取对应的别名
    '         1. 如果能够找到，则设置别名
    '         2. 如果无法找到，则清空这个列的表名部分

    ' 1.
    If originTableName = "" Then
        Exit Sub
    End If

    ' 2. 搜索表名所在的作用域
    Dim targetEnv As ISqlTranslateEnv
    Set targetEnv = startEnv
    While Not targetEnv Is Nothing
        ' 2.1 到缓存 `translatedTableNameMap` 中检查【表名】是否存在
        '     如果存在，则立刻退出
        If targetEnv.isInTranslatedTableNameMap(originTableName) Then
            GoTo findEnvBreak
        End If

        ' 2.2 如果【表名】不在缓存中，则到父作用域中搜索
        Set targetEnv = targetEnv.getParentEnv
    Wend
findEnvBreak:

    ' 如果未找到一个可用的作用域，则立刻停止
    If targetEnv Is Nothing Then
        Exit Sub
    End If

    ' 3.
    If Not targetEnv.isTableAlias(originTableName) Then
        Dim tableAliasName As String
        tableAliasName = targetEnv.findTableAliasName(originTableName)

        If tableAliasName <> "" Then
            ISqlTranslateColInfo_setTableAliasName tableAliasName
        End If
    End if
End Sub

'################################################################
' Implements ISqlTranslateNameInfo Function
'################################################################
' 获取转换后名称
Public Function ISqlTranslateNameInfo_getTranslatedName() As String
    'return ""
End Function

' 获取别名
Public Function ISqlTranslateNameInfo_getAliasName() As String
    'return ""
End Function

' 获取非要求类型的名称
Public Function ISqlTranslateNameInfo_getReverseTypeName() As String
    'return ""
End Function